home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / Implementation / Binding / PartWrap.cpp < prev   
Encoding:
C/C++ Source or Header  |  1997-02-13  |  36.3 KB  |  1,623 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        PartWrap.cpp
  3.  
  4.     Contains:    Implementation of class ODPartWrapper
  5.  
  6.     Owned by:    Caia Grisar
  7.  
  8.     Copyright:    © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <10>      11/21/96    RA        Write out user strings for preferred editor
  13.                                     and kind
  14.          <9>      11/19/96    CC        1354893 Create new frames during move to
  15.                                     simplify in-limbo recipes.
  16.          <8>      11/19/96    EL        1372967: Need missing library name in
  17.                                     NoPart message. In change editor, when
  18.                                     changing to NoPart, let binding pick NoPart
  19.                                     to ensure getting library name.
  20.          <7>     10/7/96    RA        1343814: Store user string for preferred
  21.                                     kind in SU
  22.          <6>     7/11/96    jpa        1364071: UseEditor sets message of
  23.                                     newly-created NoParts.
  24.          <5>     6/22/96    EL        1344140: in use editor, throw if change
  25.                                     editor fails.
  26.          <4>      6/4/96    EL        1335851: GetEditor should return a copy
  27.                                     rather than a pointer.
  28.          <3>     5/24/96    jpa        1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
  29.  
  30.     In Progress:
  31.         
  32. */
  33.  
  34. #ifndef SOM_ODFrame_xh
  35. #include <Frame.xh>
  36. #endif
  37.  
  38. #ifndef SOM_ODFacet_xh
  39. #include <Facet.xh>
  40. #endif
  41.  
  42. #ifndef SOM_ODShape_xh
  43. #include <Shape.xh>
  44. #endif
  45.  
  46. #ifndef SOM_ODTransform_xh
  47. #include <Trnsform.xh>
  48. #endif
  49.  
  50. #ifndef SOM_ODWindow_xh
  51. #include <Window.xh>
  52. #endif
  53.  
  54. #ifndef SOM_ODDraft_xh
  55. #include <Draft.xh>
  56. #endif
  57.  
  58. #ifndef SOM_ODStorageUnit_xh
  59. #include <StorageU.xh>
  60. #endif
  61.  
  62. #ifndef _ODNEWOBJ_
  63. #include "ODNewObj.h"
  64. #endif
  65.  
  66. #ifndef _ODUTILS_
  67. #include "ODUtils.h"
  68. #endif
  69.  
  70. #ifndef _STDTYPIO_
  71. #include "StdTypIO.h"
  72. #endif
  73.  
  74. #ifndef _TEMPOBJ_
  75. #include "TempObj.h"
  76. #endif
  77.  
  78. #ifndef _INFOUTIL_
  79. #include "InfoUtil.h"
  80. #endif
  81.  
  82. #ifndef __QUICKDRAW__
  83. #include <Quickdraw.h>
  84. #endif
  85.  
  86. #ifndef SOM_Apple_NoPart_xh
  87. #include <NoPart.xh>
  88. #endif
  89.  
  90. #ifndef _ISOSTR_
  91. #include "ISOStr.h"
  92. #endif
  93.  
  94. #ifndef SOM_ODUndo_xh
  95. #include <Undo.xh>
  96. #endif
  97.  
  98. #ifndef SOM_ODWindowState_xh
  99. #include <WinStat.xh>
  100. #endif
  101.  
  102. #if ODDebug
  103. #ifndef SOM_ODArbitrator_xh
  104. #include <Arbitrat.xh>
  105. #endif
  106.  
  107. #ifndef SOM_Module_OpenDoc_Foci_defined
  108. #include "Foci.xh"
  109. #endif
  110.  
  111. #ifndef _EXCEPT_
  112. #include <Except.h>
  113. #endif
  114. #endif
  115.  
  116. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  117. #include <StdDefs.xh>
  118. #endif
  119.  
  120. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  121. #include <StdTypes.xh>
  122. #endif
  123.  
  124. #ifndef SOM_Module_OpenDoc_StdProps_defined
  125. #include <StdProps.xh>
  126. #endif
  127.  
  128. #ifndef _STORUTIL_
  129. #include <StorUtil.h>
  130. #endif
  131.  
  132. #ifndef _BNDNSUTL_
  133. #include <BndNSUtl.h>
  134. #endif
  135.  
  136. #ifndef _BINDINGUTILS_
  137. #include "BindingUtils.h"
  138. #endif
  139.  
  140. #ifndef SOM_ODBinding_xh
  141. #include <ODBindng.xh>
  142. #endif
  143.  
  144. #ifndef _BINDNGH_
  145. #include "BindngH.h"
  146. #endif
  147.  
  148. #pragma segment  PartWrapper
  149.  
  150. #define ODPartWrapper_Class_Source
  151. #define VARIABLE_MACROS
  152. #include <PartWrap.xih>
  153.  
  154. #undef LOGGING
  155. #define LOGGING 0
  156.  
  157. //==============================================================================
  158. // ODPartWrapper
  159. //==============================================================================
  160.  
  161. SOM_Scope void  SOMLINK ODPartWrapperInitPartWrapper(ODPartWrapper *somSelf, Environment *ev)
  162. {
  163.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  164.     
  165. }
  166.  
  167. SOM_Scope void  SOMLINK ODPartWrapperSetRealPart(ODPartWrapper *somSelf, Environment *ev,
  168.         ODPart* realPart, ODEditor editor)
  169. {
  170.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  171.     
  172.     SOM_TRY
  173.         
  174.     _fPart = realPart;
  175.  
  176.     ODUShort length = (ODUShort)ODISOStrLength(editor);
  177.     _fEditor = (ODEditor)ODNewPtrClear( length+1 );
  178.     ODBlockMove(editor,  _fEditor, length+1 );
  179.     
  180.     SOM_CATCH_ALL
  181.     SOM_ENDTRY
  182. }
  183.  
  184. SOM_Scope void  SOMLINK ODPartWrapperUseEditor(ODPartWrapper *somSelf, Environment *ev,
  185.         ODEditor editor)
  186. {
  187.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  188.     
  189.     SOM_TRY
  190.  
  191.     ODEditor oldEditor = kODNULL;
  192.     ODULong currentRefCount = 0;
  193.     ODStorageUnit* su = kODNULL;
  194.     ODDraft* draft = kODNULL;
  195.     ODSession* session = kODNULL;
  196.     ODPart* newRealPart = kODNULL;
  197.     ODULong i = 0;
  198.     ODError errorCode = kODNoError;
  199.     
  200.     oldEditor = _fEditor;
  201.     if ( !ODISOStrEqual( editor, oldEditor) )
  202.     {
  203.         if (_fPartInUse)
  204.             THROW(kODErrPartInUse);
  205.         else
  206.         {
  207.             if (_fPart)
  208.             {
  209.                 su = _fPart->GetStorageUnit(ev);
  210.                 su->Acquire(ev);
  211.                 TempODStorageUnit tempSU = su; // ensure it's released
  212.                 draft = su->GetDraft(ev);
  213.     
  214.                 session = su->GetSession(ev);
  215.                 session->GetUndo(ev)->ClearActionHistory(ev, kODDontRespectMarks);
  216.                 session->GetWindowState(ev)->Externalize(ev, draft);
  217.     
  218.                 _fPart->Acquire(ev);    // prevent frame closing from releasing part to zero refcount
  219.                 TRY
  220.                     draft->SwapPart(ev, somSelf);
  221.                 CATCH_ALL
  222.                     _fPart->Release(ev);
  223.                     RERAISE;
  224.                 ENDTRY
  225.         
  226.                 currentRefCount = _fPart->GetRefCount(ev);
  227.                 for (i=currentRefCount; i>0; --i)
  228.                     _fPart->Release(ev);
  229.             
  230.                 draft->ReleaseRealPart(ev, _fPart);
  231.                 
  232.                 TRY
  233.                     newRealPart = draft->ConstructRealPart(ev,
  234.                                             su, kODTrue, somSelf, kODNULL, editor);
  235.                     if (!ODISOStrEqual(_fEditor, editor)) {
  236.                         somSelf->SetRealPart(ev, newRealPart, oldEditor);
  237.                         errorCode = kODErrAlreadyNotified;
  238.                     }
  239.                     else
  240.                         somSelf->SetRealPart(ev, newRealPart, editor);
  241.                 CATCH_ALL
  242.                     errorCode = ErrorCode();
  243.                     ODBoolean oldEditorIsNoPart = ODISOStrEqual(oldEditor,kODBlackBoxHandlerOfLastResort); ODVolatile(oldEditorIsNoPart);
  244.                     TRY
  245.                         if ( oldEditorIsNoPart )
  246.                             newRealPart = draft->ConstructRealPart(ev,
  247.                                                 su, kODTrue, somSelf, kODNULL, kODNULL);
  248.                         else
  249.                             newRealPart = draft->ConstructRealPart(ev,
  250.                                                 su, kODTrue, somSelf, kODNULL, oldEditor);
  251.                     CATCH_ALL
  252.                         if ( !oldEditorIsNoPart )
  253.                             newRealPart = draft->ConstructRealPart(ev,
  254.                                                 su, kODTrue, somSelf, kODNULL, kODBlackBoxHandlerOfLastResort);
  255.                     ENDTRY
  256.                     somSelf->SetRealPart(ev, newRealPart, oldEditor);
  257. //                    errorCode = ErrorCode();
  258.                 ENDTRY
  259.             }
  260.             else
  261.             {
  262.                 // $$$$$ this case should never occur, I don't think UseEditor is
  263.                 // called to create new parts anymore. --JBS
  264.                 
  265.                 WARN("Code assumes this case will never occur!");
  266.                 newRealPart = draft->ConstructRealPart(ev, kODNULL, kODFalse, somSelf, kODNULL, editor);
  267.                 somSelf->SetRealPart(ev, newRealPart, editor);
  268.             }
  269.             
  270.             if (_fPart)
  271.             {                        
  272.                 for (i=currentRefCount; i>1; --i)  // 1 not 0 because part created with rc = 1.
  273.                     _fPart->Acquire(ev);    
  274.             }
  275.             
  276.             if (session) // implies part was swapped above
  277.             {
  278.                 _fPart->Release(ev);    // balance acquire before SwapPart above
  279.                 session->GetWindowState(ev)->Internalize(ev, draft);
  280.             }
  281.         }
  282.     }
  283.     
  284.     THROW_IF_ERROR(errorCode);  // let user know editor didn't get swapped
  285.     
  286.     SOM_CATCH_ALL
  287.     SOM_ENDTRY
  288. }
  289.  
  290. SOM_Scope ODEditor  SOMLINK ODPartWrapperGetEditor(ODPartWrapper *somSelf, Environment *ev)
  291. {
  292.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  293.     
  294.     ODUShort length = (ODUShort)ODISOStrLength(_fEditor);
  295.     
  296.     ODEditor partName = (ODEditor)ODNewPtrClear( length+1 );;
  297.     ODBlockMove(_fEditor,  partName, length+1 );
  298.     return partName;
  299.  
  300. }
  301. /*
  302. SOM_Scope void  SOMLINK ODPartWrappersomInit(ODPartWrapper *somSelf)
  303. {
  304.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  305.  
  306.     _fPart = kODNULL;
  307.     parent_somInit(somSelf);
  308. }
  309. */
  310. SOM_Scope void  SOMLINK ODPartWrappersomUninit(ODPartWrapper *somSelf)
  311. {
  312.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  313.  
  314.     ODDeleteObject(_fEditor);
  315.     if( _fPart ) {
  316.         TRY{
  317.             Environment* ev = somGetGlobalEnvironment();
  318.             _fPart->GetStorageUnit(ev)->GetDraft(ev)->DeleteRealPart(ev, _fPart);
  319.         }CATCH_ALL{
  320.             // ignore exception
  321.         }ENDTRY
  322.     }
  323. }
  324.  
  325. SOM_Scope void  SOMLINK ODPartWrapperFulfillPromise(ODPartWrapper *somSelf, Environment *ev,
  326.         ODStorageUnitView* promiseSUView)
  327. {
  328.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  329.     
  330.     SOM_TRY
  331.  
  332.     _fPart->FulfillPromise(ev,promiseSUView);
  333.  
  334.     SOM_CATCH_ALL
  335.     SOM_ENDTRY
  336. }
  337.  
  338. SOM_Scope void  SOMLINK ODPartWrapperDropCompleted(ODPartWrapper *somSelf, Environment *ev,
  339.         ODPart* destPart,
  340.         ODDropResult dropResult)
  341. {
  342.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  343.     
  344.     SOM_TRY
  345.  
  346.     _fPart->DropCompleted(ev,destPart,dropResult);
  347.     
  348.     SOM_CATCH_ALL
  349.     SOM_ENDTRY
  350. }
  351.  
  352. SOM_Scope ODDragResult  SOMLINK ODPartWrapperDragEnter(ODPartWrapper *somSelf, Environment *ev,
  353.         ODDragItemIterator* dragInfo,
  354.         ODFacet* facet,
  355.         ODPoint* where)
  356. {
  357.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  358.     ODDragResult    dragResult = kODFalse;
  359.     
  360.     SOM_TRY
  361.     
  362.     dragResult = _fPart->DragEnter(ev,dragInfo,facet,where);
  363.  
  364.     SOM_CATCH_ALL
  365.     SOM_ENDTRY
  366.  
  367.     return dragResult;
  368. }
  369.  
  370. SOM_Scope ODDragResult  SOMLINK ODPartWrapperDragWithin(ODPartWrapper *somSelf, Environment *ev,
  371.         ODDragItemIterator* dragInfo,
  372.         ODFacet* facet,
  373.         ODPoint* where)
  374. {
  375.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  376.     ODDragResult    dragResult = kODFalse;
  377.     
  378.     SOM_TRY
  379.     
  380.     dragResult = _fPart->DragWithin(ev,dragInfo,facet,where);
  381.  
  382.     SOM_CATCH_ALL
  383.     SOM_ENDTRY
  384.  
  385.     return dragResult;
  386. }
  387.  
  388. SOM_Scope void  SOMLINK ODPartWrapperDragLeave(ODPartWrapper *somSelf, Environment *ev,
  389.         ODFacet* facet,
  390.         ODPoint* where)
  391. {
  392.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  393.     
  394.     SOM_TRY
  395.     
  396.     _fPart->DragLeave(ev,facet,where);
  397.  
  398.     SOM_CATCH_ALL
  399.     SOM_ENDTRY
  400. }
  401.  
  402. SOM_Scope ODDropResult  SOMLINK ODPartWrapperDrop(ODPartWrapper *somSelf, Environment *ev,
  403.         ODDragItemIterator* dropInfo,
  404.         ODFacet* facet,
  405.         ODPoint* where)
  406. {
  407.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  408.     
  409.     ODDragResult    dragResult = kODDropFail;
  410.     
  411.     SOM_TRY
  412.     
  413.     dragResult = _fPart->Drop(ev,dropInfo,facet,where);
  414.  
  415.     SOM_CATCH_ALL
  416.     SOM_ENDTRY
  417.  
  418.     return dragResult;
  419. }
  420.  
  421. SOM_Scope void  SOMLINK ODPartWrapperContainingPartPropertiesUpdated(ODPartWrapper *somSelf, Environment *ev,
  422.         ODFrame* frame,
  423.         ODStorageUnit* propertyUnit)
  424. {
  425.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  426.     
  427.     SOM_TRY
  428.     
  429.     _fPart->ContainingPartPropertiesUpdated(ev,frame,propertyUnit);
  430.  
  431.     SOM_CATCH_ALL
  432.     SOM_ENDTRY
  433. }
  434.  
  435. SOM_Scope ODStorageUnit*  SOMLINK ODPartWrapperAcquireContainingPartProperties(ODPartWrapper *somSelf, Environment *ev,
  436.         ODFrame* frame)
  437. {
  438.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  439.     ODStorageUnit* partProps = kODNULL;
  440.     
  441.     SOM_TRY
  442.     
  443.     partProps = _fPart->AcquireContainingPartProperties(ev,frame);
  444.  
  445.     SOM_CATCH_ALL
  446.     SOM_ENDTRY
  447.  
  448.     return partProps;
  449. }
  450.  
  451. SOM_Scope ODBoolean  SOMLINK ODPartWrapperRevealFrame(ODPartWrapper *somSelf, Environment *ev,
  452.         ODFrame* embeddedFrame,
  453.         ODShape* revealShape)
  454. {
  455.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  456.     ODBoolean    revealFrame = kODFalse;
  457.  
  458.     SOM_TRY
  459.  
  460.     revealFrame = _fPart->RevealFrame(ev,embeddedFrame,revealShape);
  461.  
  462.     SOM_CATCH_ALL
  463.     SOM_ENDTRY
  464.  
  465.     return revealFrame;
  466. }
  467.  
  468. SOM_Scope void  SOMLINK ODPartWrapperEmbeddedFrameSpec(ODPartWrapper *somSelf, Environment *ev,
  469.         ODFrame* embeddedFrame,
  470.         ODObjectSpec* spec)
  471. {
  472.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  473.     
  474.     SOM_TRY
  475.     
  476.     _fPart->EmbeddedFrameSpec(ev,embeddedFrame,spec);
  477.  
  478.     SOM_CATCH_ALL
  479.     SOM_ENDTRY
  480. }
  481.  
  482. SOM_Scope ODEmbeddedFramesIterator*  SOMLINK ODPartWrapperCreateEmbeddedFramesIterator(ODPartWrapper *somSelf, Environment *ev,
  483.         ODFrame* frame)
  484. {
  485.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  486.     ODEmbeddedFramesIterator*    itr = kODNULL;
  487.     
  488.     SOM_TRY
  489.     
  490.     itr = _fPart->CreateEmbeddedFramesIterator(ev,frame);
  491.  
  492.     SOM_CATCH_ALL
  493.     SOM_ENDTRY
  494.  
  495.     return itr;
  496. }
  497.  
  498. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameAdded(ODPartWrapper *somSelf, Environment *ev,
  499.         ODFrame* frame)
  500. {
  501.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  502.  
  503.     SOM_TRY
  504.     
  505.     _fPart->DisplayFrameAdded(ev,frame);
  506.  
  507.     SOM_CATCH_ALL
  508.     SOM_ENDTRY
  509. }
  510.  
  511. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameRemoved(ODPartWrapper *somSelf, Environment *ev,
  512.         ODFrame* frame)
  513. {
  514.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  515.  
  516.     SOM_TRY
  517.  
  518.     _fPart->DisplayFrameRemoved(ev,frame);
  519. #if ODDebug
  520.  
  521.         // Sanity check to make sure parts have relinquished foci.
  522.         // It would be more general to have a private ODArbitrator
  523.         // method to determine if any frames of a part still own
  524.         // foci
  525.         
  526.         ODStorageUnit* su = _fPart->GetStorageUnit(ev);
  527.         ODSession* session = su->GetSession(ev);
  528.         ODArbitrator* arbitrator = session->GetArbitrator(ev);
  529.                 
  530.         {
  531.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODSelectionFocus));
  532.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  533.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has selection focus", frame, _fPart);
  534.         }
  535.         {
  536.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODMenuFocus));
  537.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  538.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has menu focus", frame, _fPart);
  539.         }
  540.         {
  541.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODKeyFocus));
  542.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  543.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has key focus", frame, _fPart);
  544.         }
  545.         {
  546.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODScrollingFocus));
  547.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  548.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has scrolling focus", frame, _fPart);
  549.         }
  550.         {
  551.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODClipboardFocus));
  552.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  553.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has clipboard focus", frame, _fPart);
  554.         }
  555.  
  556. #endif
  557.  
  558.     SOM_CATCH_ALL
  559.     SOM_ENDTRY
  560. }
  561.  
  562. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameConnected(ODPartWrapper *somSelf, Environment *ev,
  563.         ODFrame* frame)
  564. {
  565.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  566.  
  567.     SOM_TRY
  568.  
  569.     _fPart->DisplayFrameConnected(ev,frame);
  570.  
  571.     SOM_CATCH_ALL
  572.     SOM_ENDTRY
  573. }
  574.  
  575. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameClosed(ODPartWrapper *somSelf, Environment *ev,
  576.         ODFrame* frame)
  577. {
  578.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  579.  
  580.     SOM_TRY
  581.  
  582.     _fPart->DisplayFrameClosed(ev,frame);
  583. #if ODDebug
  584.  
  585.         // Sanity check to make sure parts have relinquished foci.
  586.         // It would be more general to have a private ODArbitrator
  587.         // method to determine if any frames of a part still own
  588.         // foci
  589.         
  590.         ODStorageUnit* su = _fPart->GetStorageUnit(ev);
  591.         ODSession* session = su->GetSession(ev);
  592.         ODArbitrator* arbitrator = session->GetArbitrator(ev);
  593.                 
  594.         {
  595.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODSelectionFocus));
  596.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  597.             WARN("DisplayFrameClosed: Frame %x of Part %x still has selection focus", frame, _fPart);
  598.         }
  599.         {
  600.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODMenuFocus));
  601.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  602.             WARN("DisplayFrameClosed: Frame %x of Part %x still has menu focus", frame, _fPart);
  603.         }
  604.         {
  605.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODKeyFocus));
  606.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  607.             WARN("DisplayFrameClosed: Frame %x of Part %x still has key focus", frame, _fPart);
  608.         }
  609.         {
  610.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODScrollingFocus));
  611.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  612.             WARN("DisplayFrameClosed: Frame %x of Part %x still has scrolling focus", frame, _fPart);
  613.         }
  614.         {
  615.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODClipboardFocus));
  616.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  617.             WARN("DisplayFrameClosed: Frame %x of Part %x still has clipboard focus", frame, _fPart);
  618.         }
  619.  
  620. #endif
  621.  
  622.     SOM_CATCH_ALL
  623.     SOM_ENDTRY
  624. }
  625.  
  626. SOM_Scope void  SOMLINK ODPartWrapperAttachSourceFrame(ODPartWrapper *somSelf, Environment *ev,
  627.         ODFrame* frame,
  628.         ODFrame* sourceFrame)
  629. {
  630.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  631.  
  632.     SOM_TRY
  633.  
  634.     if ( frame && frame->IsMoving(ev) )
  635.     {
  636.         if ( sourceFrame )
  637.             frame->SetFrozen(ev, sourceFrame->IsFrozen(ev));
  638.         _fPart->GetStorageUnit(ev)->GetDraft(ev)->TransferPersistentObjectID(ev, sourceFrame, frame);
  639.     }
  640.  
  641.     _fPart->AttachSourceFrame(ev,frame,sourceFrame);
  642.  
  643.     SOM_CATCH_ALL
  644.     SOM_ENDTRY
  645. }
  646.  
  647. SOM_Scope void  SOMLINK ODPartWrapperFrameShapeChanged(ODPartWrapper *somSelf, Environment *ev,
  648.         ODFrame* frame)
  649. {
  650.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  651.  
  652.     SOM_TRY
  653.  
  654.     _fPart->FrameShapeChanged(ev,frame);
  655.  
  656.     SOM_CATCH_ALL
  657.     SOM_ENDTRY
  658. }
  659.  
  660. SOM_Scope void  SOMLINK ODPartWrapperViewTypeChanged(ODPartWrapper *somSelf, Environment *ev,
  661.         ODFrame* frame)
  662. {
  663.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  664.  
  665.     SOM_TRY
  666.  
  667.     _fPart->ViewTypeChanged(ev,frame);
  668.  
  669.     SOM_CATCH_ALL
  670.     SOM_ENDTRY
  671. }
  672.  
  673. SOM_Scope void  SOMLINK ODPartWrapperPresentationChanged(ODPartWrapper *somSelf, Environment *ev,
  674.         ODFrame* frame)
  675. {
  676.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  677.  
  678.     SOM_TRY
  679.  
  680.     _fPart->PresentationChanged(ev,frame);
  681.  
  682.     SOM_CATCH_ALL
  683.     SOM_ENDTRY
  684. }
  685.  
  686. SOM_Scope void  SOMLINK ODPartWrapperSequenceChanged(ODPartWrapper *somSelf, Environment *ev,
  687.         ODFrame* frame)
  688. {
  689.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  690.  
  691.     SOM_TRY
  692.  
  693.     _fPart->SequenceChanged(ev,frame);
  694.  
  695.     SOM_CATCH_ALL
  696.     SOM_ENDTRY
  697. }
  698.  
  699. SOM_Scope ODInfoType  SOMLINK ODPartWrapperReadPartInfo(ODPartWrapper *somSelf, Environment *ev,
  700.         ODFrame* frame,
  701.         ODStorageUnitView* storageUnitView)
  702. {
  703.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  704.     ODInfoType partInfo = kODNULL;
  705.     
  706.     SOM_TRY
  707.  
  708.     partInfo = _fPart->ReadPartInfo(ev,frame,storageUnitView);
  709.  
  710.     SOM_CATCH_ALL
  711.     SOM_ENDTRY
  712.     
  713.     return partInfo;
  714. }
  715.  
  716. SOM_Scope void  SOMLINK ODPartWrapperWritePartInfo(ODPartWrapper *somSelf, Environment *ev,
  717.         ODInfoType partInfo,
  718.         ODStorageUnitView* storageUnitView)
  719. {
  720.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  721.  
  722.     SOM_TRY
  723.  
  724.     _fPart->WritePartInfo(ev,partInfo,storageUnitView);
  725.  
  726.     SOM_CATCH_ALL
  727.     SOM_ENDTRY
  728. }
  729.  
  730. SOM_Scope void  SOMLINK ODPartWrapperClonePartInfo(ODPartWrapper *somSelf, Environment *ev,
  731.         ODDraftKey key,
  732.         ODInfoType partInfo,
  733.         ODStorageUnitView* storageUnitView,
  734.         ODFrame* scopeFrame)
  735. {
  736.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  737.  
  738.     SOM_TRY
  739.  
  740.     _fPart->ClonePartInfo(ev,key,partInfo,storageUnitView,scopeFrame);
  741.  
  742.     SOM_CATCH_ALL
  743.     SOM_ENDTRY
  744. }
  745.  
  746. SOM_Scope ODID  SOMLINK ODPartWrapperOpen(ODPartWrapper *somSelf, Environment *ev,
  747.         ODFrame* frame)
  748. {
  749.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  750.     ODID    id = 0;
  751.     
  752.     SOM_TRY
  753.  
  754.     id = _fPart->Open(ev,frame);
  755.  
  756.     SOM_CATCH_ALL
  757.     SOM_ENDTRY
  758.     
  759.     return id;
  760. }
  761.  
  762. SOM_Scope ODFrame*  SOMLINK ODPartWrapperRequestEmbeddedFrame(ODPartWrapper *somSelf, Environment *ev,
  763.         ODFrame* containingFrame,
  764.         ODFrame* baseFrame,
  765.         ODShape* frameShape,
  766.         ODPart* embedPart,
  767.         ODTypeToken viewType,
  768.         ODTypeToken presentation,
  769.         ODBoolean isOverlaid)
  770. {
  771.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  772.     ODFrame*    frame = kODNULL;
  773.     
  774.     SOM_TRY
  775.  
  776.     frame = _fPart->RequestEmbeddedFrame(ev,containingFrame,baseFrame,frameShape,embedPart,viewType,presentation,isOverlaid);
  777.  
  778.     SOM_CATCH_ALL
  779.     SOM_ENDTRY
  780.     
  781.     return frame;
  782. }
  783.  
  784. SOM_Scope void  SOMLINK ODPartWrapperRemoveEmbeddedFrame(ODPartWrapper *somSelf, Environment *ev,
  785.         ODFrame* embeddedFrame)
  786. {
  787.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  788.  
  789.     SOM_TRY
  790.  
  791.     _fPart->RemoveEmbeddedFrame(ev,embeddedFrame);
  792.  
  793.     SOM_CATCH_ALL
  794.     SOM_ENDTRY
  795. }
  796.  
  797. SOM_Scope ODShape*  SOMLINK ODPartWrapperRequestFrameShape(ODPartWrapper *somSelf, Environment *ev,
  798.         ODFrame* embeddedFrame,
  799.         ODShape* frameShape)
  800. {
  801.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  802.     ODShape*    shape = kODNULL;
  803.     
  804.     SOM_TRY
  805.  
  806.     shape = _fPart->RequestFrameShape(ev,embeddedFrame,frameShape);
  807.  
  808.     SOM_CATCH_ALL
  809.     SOM_ENDTRY
  810.     
  811.     return shape;
  812. }
  813.  
  814. SOM_Scope void  SOMLINK ODPartWrapperUsedShapeChanged(ODPartWrapper *somSelf, Environment *ev,
  815.         ODFrame* embeddedFrame)
  816. {
  817.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  818.  
  819.     SOM_TRY
  820.  
  821.     _fPart->UsedShapeChanged(ev,embeddedFrame);
  822.  
  823.     SOM_CATCH_ALL
  824.     SOM_ENDTRY
  825. }
  826.  
  827. SOM_Scope ODShape*  SOMLINK ODPartWrapperAdjustBorderShape(ODPartWrapper *somSelf, Environment *ev,
  828.         ODFacet* embeddedFacet,
  829.         ODShape* shape)
  830. {
  831.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  832.     ODShape*    borderShape = kODNULL;
  833.     
  834.     SOM_TRY
  835.  
  836.     borderShape = _fPart->AdjustBorderShape(ev,embeddedFacet,shape);
  837.  
  838.     SOM_CATCH_ALL
  839.     SOM_ENDTRY
  840.     
  841.     return borderShape;
  842. }
  843.  
  844. SOM_Scope void  SOMLINK ODPartWrapperFacetAdded(ODPartWrapper *somSelf, Environment *ev,
  845.         ODFacet* facet)
  846. {
  847.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  848.  
  849.     SOM_TRY
  850.  
  851.     _fPart->FacetAdded(ev,facet);
  852.  
  853.     SOM_CATCH_ALL
  854.     SOM_ENDTRY
  855. }
  856.  
  857. SOM_Scope void  SOMLINK ODPartWrapperFacetRemoved(ODPartWrapper *somSelf, Environment *ev,
  858.         ODFacet* facet)
  859. {
  860.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  861.  
  862.     SOM_TRY
  863.  
  864.     _fPart->FacetRemoved(ev,facet);
  865.  
  866.     SOM_CATCH_ALL
  867.     SOM_ENDTRY
  868. }
  869.  
  870. SOM_Scope void  SOMLINK ODPartWrapperCanvasChanged(ODPartWrapper *somSelf, Environment *ev,
  871.         ODFacet* facet)
  872. {
  873.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  874.  
  875.     SOM_TRY
  876.  
  877.     _fPart->CanvasChanged(ev,facet);
  878.  
  879.     SOM_CATCH_ALL
  880.     SOM_ENDTRY
  881. }
  882.  
  883. SOM_Scope void  SOMLINK ODPartWrapperGeometryChanged(ODPartWrapper *somSelf, Environment *ev,
  884.         ODFacet* facet,
  885.         ODBoolean clipShapeChanged,
  886.         ODBoolean externalTransformChanged)
  887. {
  888.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  889.  
  890.     SOM_TRY
  891.  
  892.     _fPart->GeometryChanged(ev,facet,clipShapeChanged,externalTransformChanged);
  893.  
  894.     SOM_CATCH_ALL
  895.     SOM_ENDTRY
  896. }
  897.  
  898. SOM_Scope void  SOMLINK ODPartWrapperDraw(ODPartWrapper *somSelf, Environment *ev,
  899.         ODFacet* facet,
  900.         ODShape* invalidShape)
  901. {
  902.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  903.  
  904.     SOM_TRY
  905.  
  906.     _fPart->Draw(ev,facet,invalidShape);
  907.  
  908.     SOM_CATCH_ALL
  909.     SOM_ENDTRY
  910. }
  911.  
  912. SOM_Scope void  SOMLINK ODPartWrapperCanvasUpdated(ODPartWrapper *somSelf, Environment *ev,
  913.         ODCanvas* canvas)
  914. {
  915.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  916.  
  917.     SOM_TRY
  918.  
  919.     _fPart->CanvasUpdated(ev,canvas);
  920.  
  921.     SOM_CATCH_ALL
  922.     SOM_ENDTRY
  923. }
  924.  
  925. SOM_Scope void  SOMLINK ODPartWrapperHighlightChanged(ODPartWrapper *somSelf, Environment *ev,
  926.         ODFacet* facet)
  927. {
  928.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  929.  
  930.     SOM_TRY
  931.  
  932.     _fPart->HighlightChanged(ev,facet);
  933.  
  934.     SOM_CATCH_ALL
  935.     SOM_ENDTRY
  936. }
  937.  
  938. SOM_Scope ODULong  SOMLINK ODPartWrapperGetPrintResolution(ODPartWrapper *somSelf, Environment *ev,
  939.         ODFrame* frame)
  940. {
  941.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  942.     ODULong    printRes = 0;
  943.     
  944.     SOM_TRY
  945.  
  946.     printRes = _fPart->GetPrintResolution(ev,frame);
  947.  
  948.     SOM_CATCH_ALL
  949.     SOM_ENDTRY
  950.     
  951.     return printRes;
  952. }
  953.  
  954. SOM_Scope ODLinkSource*  SOMLINK ODPartWrapperCreateLink(ODPartWrapper *somSelf, Environment *ev,
  955.         ODByteArray* data)
  956. {
  957.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  958.     ODLinkSource*    link = kODNULL;
  959.     
  960.     SOM_TRY
  961.  
  962.     link = _fPart->CreateLink(ev,data);
  963.  
  964.     SOM_CATCH_ALL
  965.     SOM_ENDTRY
  966.     
  967.     return link;
  968. }
  969.  
  970. SOM_Scope void  SOMLINK ODPartWrapperLinkUpdated(ODPartWrapper *somSelf, Environment *ev,
  971.         ODLink* updatedLink,
  972.         ODUpdateID change)
  973. {
  974.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  975.  
  976.     SOM_TRY
  977.  
  978.     _fPart->LinkUpdated(ev,updatedLink,change);
  979.  
  980.     SOM_CATCH_ALL
  981.     SOM_ENDTRY
  982. }
  983.  
  984. SOM_Scope void  SOMLINK ODPartWrapperRevealLink(ODPartWrapper *somSelf, Environment *ev,
  985.         ODLinkSource* linkSource)
  986. {
  987.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  988.  
  989.     SOM_TRY
  990.  
  991.     _fPart->RevealLink(ev,linkSource);
  992.  
  993.     SOM_CATCH_ALL
  994.     SOM_ENDTRY
  995. }
  996.  
  997. SOM_Scope void  SOMLINK ODPartWrapperEmbeddedFrameUpdated(ODPartWrapper *somSelf, Environment *ev,
  998.         ODFrame* frame,
  999.         ODUpdateID change)
  1000. {
  1001.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1002.  
  1003.     SOM_TRY
  1004.  
  1005.     _fPart->EmbeddedFrameUpdated(ev,frame,change);
  1006.  
  1007.     SOM_CATCH_ALL
  1008.     SOM_ENDTRY
  1009. }
  1010.  
  1011. SOM_Scope ODBoolean SOMLINK ODPartWrapperEditInLinkAttempted(ODPartWrapper *somSelf, Environment *ev,
  1012.         ODFrame* frame)
  1013. {
  1014.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1015.     ODBoolean result = kODFalse;
  1016.  
  1017.     SOM_TRY
  1018.  
  1019.     result = _fPart->EditInLinkAttempted(ev,frame);
  1020.  
  1021.     SOM_CATCH_ALL
  1022.     SOM_ENDTRY
  1023.  
  1024.     return result;
  1025. }
  1026.  
  1027. SOM_Scope void  SOMLINK ODPartWrapperLinkStatusChanged(ODPartWrapper *somSelf, Environment *ev,
  1028.         ODFrame* frame)
  1029. {
  1030.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1031.  
  1032.     SOM_TRY
  1033.  
  1034.     _fPart->LinkStatusChanged(ev,frame);
  1035.  
  1036.     SOM_CATCH_ALL
  1037.     SOM_ENDTRY
  1038. }
  1039.  
  1040. SOM_Scope ODBoolean  SOMLINK ODPartWrapperBeginRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1041.         ODTypeToken focus,
  1042.         ODFrame* ownerFrame,
  1043.         ODFrame* proposedFrame)
  1044. {
  1045.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1046.     ODBoolean    relinqFocus = kODFalse;
  1047.     
  1048.     SOM_TRY
  1049.  
  1050.     relinqFocus = _fPart->BeginRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1051.  
  1052.     SOM_CATCH_ALL
  1053.     SOM_ENDTRY
  1054.     
  1055.     return relinqFocus;
  1056. }
  1057.  
  1058. SOM_Scope void  SOMLINK ODPartWrapperCommitRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1059.         ODTypeToken focus,
  1060.         ODFrame* ownerFrame,
  1061.         ODFrame* proposedFrame)
  1062. {
  1063.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1064.  
  1065.     SOM_TRY
  1066.  
  1067.     _fPart->CommitRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1068.  
  1069.     SOM_CATCH_ALL
  1070.     SOM_ENDTRY
  1071. }
  1072.  
  1073. SOM_Scope void  SOMLINK ODPartWrapperAbortRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1074.         ODTypeToken focus,
  1075.         ODFrame* ownerFrame,
  1076.         ODFrame* proposedFrame)
  1077. {
  1078.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1079.  
  1080.     SOM_TRY
  1081.  
  1082.     _fPart->AbortRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1083.  
  1084.     SOM_CATCH_ALL
  1085.     SOM_ENDTRY
  1086. }
  1087.  
  1088. SOM_Scope void  SOMLINK ODPartWrapperFocusAcquired(ODPartWrapper *somSelf, Environment *ev,
  1089.         ODTypeToken focus,
  1090.         ODFrame* ownerFrame)
  1091. {
  1092.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1093.  
  1094.     SOM_TRY
  1095.  
  1096.     _fPart->FocusAcquired(ev,focus,ownerFrame);
  1097.  
  1098.     SOM_CATCH_ALL
  1099.     SOM_ENDTRY
  1100. }
  1101.  
  1102. SOM_Scope void  SOMLINK ODPartWrapperFocusLost(ODPartWrapper *somSelf, Environment *ev,
  1103.         ODTypeToken focus,
  1104.         ODFrame* ownerFrame)
  1105. {
  1106.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1107.  
  1108.     SOM_TRY
  1109.  
  1110.     _fPart->FocusLost(ev,focus,ownerFrame);
  1111.  
  1112.     SOM_CATCH_ALL
  1113.     SOM_ENDTRY
  1114. }
  1115.  
  1116. SOM_Scope void  SOMLINK ODPartWrapperInitObject(ODPartWrapper *somSelf, Environment *ev)
  1117. {
  1118.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1119.  
  1120.     SOM_TRY
  1121.  
  1122.     _fPart->InitObject(ev);
  1123.  
  1124.     SOM_CATCH_ALL
  1125.     SOM_ENDTRY
  1126. }
  1127.  
  1128.  
  1129. SOM_Scope ODBoolean  SOMLINK ODPartWrapperHasExtension(ODPartWrapper *somSelf, Environment *ev,
  1130.         ODType extensionName)
  1131. {
  1132.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1133.     ODBoolean    hasExt = kODFalse;
  1134.     
  1135.     SOM_TRY
  1136.  
  1137.     hasExt = _fPart->HasExtension(ev,extensionName);
  1138.  
  1139.     SOM_CATCH_ALL
  1140.     SOM_ENDTRY
  1141.  
  1142.     return hasExt;
  1143. }
  1144.  
  1145. SOM_Scope ODExtension*  SOMLINK ODPartWrapperAcquireExtension(ODPartWrapper *somSelf, Environment *ev,
  1146.         ODType extensionName)
  1147. {
  1148.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1149.     ODExtension*    extName = kODNULL;
  1150.     
  1151.     SOM_TRY
  1152.  
  1153.     extName = _fPart->AcquireExtension(ev,extensionName);
  1154.  
  1155.     SOM_CATCH_ALL
  1156.     SOM_ENDTRY
  1157.  
  1158.     return extName;
  1159. }
  1160.  
  1161. SOM_Scope void  SOMLINK ODPartWrapperReleaseExtension(ODPartWrapper *somSelf, Environment *ev,
  1162.         ODExtension* extension)
  1163. {
  1164.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1165.  
  1166.     SOM_TRY
  1167.  
  1168.     _fPart->ReleaseExtension(ev,extension);
  1169.  
  1170.     SOM_CATCH_ALL
  1171.     SOM_ENDTRY
  1172. }
  1173.  
  1174. SOM_Scope ODSize  SOMLINK ODPartWrapperPurge(ODPartWrapper *somSelf, Environment *ev,
  1175.         ODSize size)
  1176. {
  1177.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1178.  
  1179.     ODSize    purgeSize = 0; ODVolatile( purgeSize );
  1180.     
  1181.     SOM_TRY
  1182.  
  1183.         purgeSize = _fPart->Purge(ev,size);
  1184.  
  1185.         purgeSize += parent_Purge(somSelf,ev,size);
  1186.     SOM_CATCH_ALL
  1187.         WARN("Error %ld trying to purge in ODPartWrapperPurge",ErrorCode());
  1188.         SetErrorCode(kODNoError);        // Eat the exception; Purge should not 
  1189.                                         // propagate it because clients function
  1190.                                         // fine whether memory was purged or not.
  1191.     SOM_ENDTRY
  1192.  
  1193.     return purgeSize;
  1194. }
  1195.  
  1196. SOM_Scope ODBoolean  SOMLINK ODPartWrapperIsEqualTo(ODPartWrapper *somSelf, Environment *ev,
  1197.         ODObject* object)
  1198. {
  1199.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1200.     ODBoolean    isEqualTo = kODFalse;
  1201.     
  1202.     SOM_TRY
  1203.  
  1204.     isEqualTo = _fPart->IsEqualTo(ev,object);
  1205.  
  1206.     SOM_CATCH_ALL
  1207.     SOM_ENDTRY
  1208.  
  1209.     return isEqualTo;
  1210. }
  1211.  
  1212. SOM_Scope void  SOMLINK ODPartWrapperSubClassResponsibility(ODPartWrapper *somSelf, Environment *ev)
  1213. {
  1214.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1215.  
  1216.  
  1217.     //_fPart->SubClassResponsibility(ev);
  1218.  
  1219.     WARN("A subclass should have overridden this method!");
  1220.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  1221. }
  1222.  
  1223. SOM_Scope void  SOMLINK ODPartWrapperInitRefCntObject(ODPartWrapper *somSelf, Environment *ev)
  1224. {
  1225.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1226.  
  1227.     SOM_TRY
  1228.  
  1229.     _fPart->InitRefCntObject(ev);
  1230.  
  1231.     SOM_CATCH_ALL
  1232.     SOM_ENDTRY
  1233. }
  1234.  
  1235. SOM_Scope void  SOMLINK ODPartWrapperAcquire(ODPartWrapper *somSelf, Environment *ev)
  1236. {
  1237.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1238.  
  1239.     SOM_TRY
  1240.  
  1241.     _fPart->Acquire(ev);
  1242.  
  1243.     SOM_CATCH_ALL
  1244.     SOM_ENDTRY
  1245. }
  1246.  
  1247. SOM_Scope void  SOMLINK ODPartWrapperRelease(ODPartWrapper *somSelf, Environment *ev)
  1248. {
  1249.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1250.  
  1251.     SOM_TRY
  1252.  
  1253.     if( _fPart ) {
  1254.         _fPart->Release(ev);
  1255.         if ( _fPart->GetRefCount(ev) == 0 ) {
  1256.             _fPart->GetStorageUnit(ev)->GetDraft(ev)->ReleasePart(ev, somSelf);
  1257.         }
  1258.     }
  1259.     
  1260.     SOM_CATCH_ALL
  1261.     SOM_ENDTRY
  1262. }
  1263.  
  1264. SOM_Scope ODULong  SOMLINK ODPartWrapperGetRefCount(ODPartWrapper *somSelf, Environment *ev)
  1265. {
  1266.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1267.     ODULong    refCount = 0;
  1268.     
  1269.     SOM_TRY
  1270.  
  1271.     refCount = _fPart->GetRefCount(ev);
  1272.  
  1273.     SOM_CATCH_ALL
  1274.     SOM_ENDTRY
  1275.  
  1276.     return refCount;
  1277. }
  1278.  
  1279. SOM_Scope void  SOMLINK ODPartWrapperInitPersistentObject(ODPartWrapper *somSelf, Environment *ev,
  1280.         ODStorageUnit* storageUnit)
  1281. {
  1282.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1283.  
  1284.     SOM_TRY
  1285.  
  1286.     _fPart->InitPersistentObject(ev,storageUnit);
  1287.  
  1288.     SOM_CATCH_ALL
  1289.     SOM_ENDTRY
  1290. }
  1291.  
  1292. SOM_Scope void  SOMLINK ODPartWrapperInitPersistentObjectFromStorage(ODPartWrapper *somSelf, Environment *ev,
  1293.         ODStorageUnit* storageUnit)
  1294. {
  1295.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1296.  
  1297.     SOM_TRY
  1298.  
  1299.      _fPart->InitPersistentObjectFromStorage(ev,storageUnit);
  1300.  
  1301.     SOM_CATCH_ALL
  1302.     SOM_ENDTRY
  1303. }
  1304.  
  1305. SOM_Scope void  SOMLINK ODPartWrapperReleaseAll(ODPartWrapper *somSelf, Environment *ev)
  1306. {
  1307.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1308.  
  1309.     SOM_TRY
  1310.     
  1311.     _fPart->ReleaseAll(ev);
  1312.  
  1313.     SOM_CATCH_ALL
  1314.     SOM_ENDTRY
  1315. }
  1316.  
  1317. #define HAS_WRITE_ACCESS(x) ((x) >= kODDPSharedWrite)
  1318.  
  1319. SOM_Scope void  SOMLINK ODPartWrapperExternalize(ODPartWrapper *somSelf, Environment *ev)
  1320. {
  1321.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1322.  
  1323.     SOM_TRY
  1324.  
  1325.     _fPart->Externalize(ev);
  1326.     
  1327.     if (!IsViewerOfLastResort(ev,somSelf))
  1328.     {
  1329.         ODStorageUnit* thePartSU = kODNULL; ODVolatile(thePartSU);
  1330.  
  1331.         TRY
  1332.         
  1333.             ODPart* realPart = kODNULL;
  1334.             
  1335.             realPart = somSelf->GetRealPart(ev);
  1336.  
  1337.             TRY
  1338.                 thePartSU =  realPart->GetStorageUnit(ev);
  1339.             CATCH_ALL
  1340.                 WARN("Could not get the real parts storage unit ; no user strings were written");
  1341.             ENDTRY
  1342.             
  1343.             somSelf->ReleaseRealPart(ev); // defined not to throw
  1344.             
  1345.         CATCH_ALL
  1346.             //Could not get the real part because kODErrPartInUse. Never mind...
  1347.             WARN("kODErrPartInUse ; the prefered kind user string was not written");
  1348.         ENDTRY
  1349.         
  1350.         TRY
  1351.         
  1352.         if (thePartSU && HAS_WRITE_ACCESS(thePartSU->GetDraft(ev)->GetPermissions(ev)))
  1353.         {
  1354.             thePartSU->Acquire(ev);
  1355.             TempODStorageUnit tempSU = thePartSU; // make sure the SU gets released
  1356.             
  1357.             // Externalize Kind user string.
  1358.             TempODType preferredKind = ODGetKindFromPartSU(ev, thePartSU);
  1359.             
  1360.             if (preferredKind)
  1361.                 ODSetPreferredKindProps(thePartSU, preferredKind);
  1362.             else
  1363.                 WARN("Could not find prefered kind for part");
  1364.             
  1365.             // Externalize Editor user string.
  1366.             ODULong size;
  1367.             TempODEditor preferredEditor = ODGetISOStrProp(ev, thePartSU, 
  1368.                                 kODPropPreferredEditor, kODEditor, kODNULL, &size);
  1369.                                 
  1370.             if (preferredEditor)
  1371.                 ODSetPreferredEditorProps(thePartSU, preferredEditor);
  1372.             else
  1373.                 WARN("Could not find prefered editor for part");
  1374.         }
  1375.         
  1376.         CATCH_ALL
  1377.             // It's not too important if we can't store a user strings for kind and/or editor; ignore as cosmetic.
  1378.         ENDTRY    
  1379.     }
  1380.     
  1381.     SOM_CATCH_ALL
  1382.     SOM_ENDTRY
  1383. }
  1384.  
  1385. SOM_Scope ODStorageUnit*  SOMLINK ODPartWrapperGetStorageUnit(ODPartWrapper *somSelf, Environment *ev)
  1386. {
  1387.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1388.  
  1389.     SOM_TRY
  1390.  
  1391.     return (_fPart->GetStorageUnit(ev));
  1392.  
  1393.     SOM_CATCH_ALL
  1394.     SOM_ENDTRY
  1395.     return kODNULL;
  1396. }
  1397.  
  1398. SOM_Scope ODID  SOMLINK ODPartWrapperGetID(ODPartWrapper *somSelf, Environment *ev)
  1399. {
  1400.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1401.  
  1402.     SOM_TRY
  1403.  
  1404.     return (_fPart->GetID(ev));
  1405.  
  1406.     SOM_CATCH_ALL
  1407.     SOM_ENDTRY
  1408.     return 0;
  1409. }
  1410.  
  1411. SOM_Scope void  SOMLINK ODPartWrapperCloneInto(ODPartWrapper *somSelf, Environment *ev,
  1412.         ODDraftKey key,
  1413.         ODStorageUnit* storageUnit,
  1414.         ODFrame* initiatingFrame)
  1415. {
  1416.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1417.  
  1418.     SOM_TRY
  1419.  
  1420.     _fPart->CloneInto(ev,key,storageUnit,initiatingFrame);
  1421.  
  1422.     SOM_CATCH_ALL
  1423.     SOM_ENDTRY
  1424. }
  1425.  
  1426. SOM_Scope void  SOMLINK ODPartWrapperExternalizeKinds(ODPartWrapper *somSelf, Environment *ev,
  1427.         ODTypeList* kindset)
  1428. {
  1429.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1430.  
  1431.     SOM_TRY
  1432.  
  1433.     _fPart->ExternalizeKinds(ev,kindset);
  1434.  
  1435.     SOM_CATCH_ALL
  1436.     SOM_ENDTRY
  1437. }
  1438.  
  1439. SOM_Scope void  SOMLINK ODPartWrapperChangeKind(ODPartWrapper *somSelf, Environment *ev,
  1440.         ODType kind)
  1441. {
  1442.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1443.  
  1444.     SOM_TRY
  1445.  
  1446.     _fPart->ChangeKind(ev,kind);
  1447.  
  1448.     SOM_CATCH_ALL
  1449.     SOM_ENDTRY
  1450. }
  1451.  
  1452. SOM_Scope ODBoolean  SOMLINK ODPartWrapperIsRealPart(ODPartWrapper *somSelf, Environment *ev)
  1453. {
  1454.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1455.  
  1456.     return kODFalse;
  1457. }
  1458.  
  1459. SOM_Scope ODPart*  SOMLINK ODPartWrapperGetRealPart(ODPartWrapper *somSelf, Environment *ev)
  1460. {
  1461.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1462.     ODPart*    realPart = kODNULL;
  1463.     
  1464.     SOM_TRY
  1465.  
  1466.     if ( _fPartInUse )
  1467.         THROW(kODErrPartInUse);
  1468.     else
  1469.     {
  1470.         _fPartInUse = kODTrue;
  1471.         realPart = _fPart;
  1472.     }
  1473.  
  1474.     SOM_CATCH_ALL
  1475.     SOM_ENDTRY
  1476.  
  1477.     return realPart;
  1478. }
  1479.  
  1480. SOM_Scope void  SOMLINK ODPartWrapperReleaseRealPart(ODPartWrapper *somSelf, Environment *ev)
  1481. {
  1482.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1483.  
  1484.     SOM_TRY
  1485.  
  1486.     _fPartInUse = kODFalse;
  1487.  
  1488.     SOM_CATCH_ALL
  1489.     SOM_ENDTRY
  1490. }
  1491.  
  1492. SOM_Scope ODBoolean  SOMLINK ODPartWrapperHandleEvent(ODPartWrapper *somSelf, Environment *ev,
  1493.         ODEventData* event,
  1494.         ODFrame* frame,
  1495.         ODFacet* facet,
  1496.         ODEventInfo* eventInfo)
  1497. {
  1498.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1499.     ODBoolean    eventHandled = kODFalse;
  1500.     
  1501.     SOM_TRY
  1502.  
  1503.     eventHandled = _fPart->HandleEvent(ev,event,frame,facet, eventInfo);
  1504.  
  1505.     SOM_CATCH_ALL
  1506.     SOM_ENDTRY
  1507.  
  1508.     return eventHandled;
  1509. }
  1510.  
  1511. SOM_Scope void  SOMLINK ODPartWrapperAdjustMenus(ODPartWrapper *somSelf, Environment *ev,
  1512.         ODFrame* frame)
  1513. {
  1514.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1515.  
  1516.     SOM_TRY
  1517.  
  1518.     _fPart->AdjustMenus(ev,frame);
  1519.  
  1520.     SOM_CATCH_ALL
  1521.     SOM_ENDTRY
  1522. }
  1523.  
  1524. SOM_Scope void  SOMLINK ODPartWrapperUndoAction(ODPartWrapper *somSelf, Environment *ev,
  1525.         ODActionData* actionState)
  1526. {
  1527.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1528.  
  1529.     SOM_TRY
  1530.  
  1531.     _fPart->UndoAction(ev,actionState);
  1532.  
  1533.     SOM_CATCH_ALL
  1534.     SOM_ENDTRY
  1535. }
  1536.  
  1537. SOM_Scope void  SOMLINK ODPartWrapperRedoAction(ODPartWrapper *somSelf, Environment *ev,
  1538.         ODActionData* actionState)
  1539. {
  1540.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1541.  
  1542.     SOM_TRY
  1543.  
  1544.     _fPart->RedoAction(ev,actionState);
  1545.  
  1546.     SOM_CATCH_ALL
  1547.     SOM_ENDTRY
  1548. }
  1549.  
  1550. SOM_Scope void  SOMLINK ODPartWrapperDisposeActionState(ODPartWrapper *somSelf, Environment *ev,
  1551.         ODActionData* actionState,
  1552.         ODDoneState doneState)
  1553. {
  1554.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1555.  
  1556.     SOM_TRY
  1557.  
  1558.     _fPart->DisposeActionState(ev,actionState,doneState);
  1559.  
  1560.     SOM_CATCH_ALL
  1561.     SOM_ENDTRY
  1562. }
  1563.  
  1564. SOM_Scope void  SOMLINK ODPartWrapperWriteActionState(ODPartWrapper *somSelf, Environment *ev,
  1565.         ODActionData* actionState,
  1566.         ODStorageUnitView* storageUnitView)
  1567. {
  1568.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1569.  
  1570.     SOM_TRY
  1571.  
  1572.     _fPart->WriteActionState(ev,actionState,storageUnitView);
  1573.  
  1574.     SOM_CATCH_ALL
  1575.     SOM_ENDTRY
  1576. }
  1577.  
  1578. SOM_Scope ODActionData  SOMLINK ODPartWrapperReadActionState(ODPartWrapper *somSelf, Environment *ev,
  1579.         ODStorageUnitView* storageUnitView)
  1580. {
  1581.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1582.  
  1583.     ODActionData data;
  1584.     data._maximum = 0;
  1585.     data._length = 0;
  1586.     data._buffer = kODNULL;
  1587.  
  1588.     SOM_TRY
  1589.  
  1590.     data = _fPart->ReadActionState(ev,storageUnitView);
  1591.  
  1592.     SOM_CATCH_ALL
  1593.     SOM_ENDTRY
  1594.  
  1595.     return data;
  1596. }
  1597.  
  1598. SOM_Scope void  SOMLINK ODPartWrapperInitPart(ODPartWrapper *somSelf, Environment *ev,
  1599.         ODStorageUnit* storageUnit, ODPart* partWrapper)
  1600. {
  1601.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1602.  
  1603.     SOM_TRY
  1604.  
  1605.     _fPart->InitPart(ev,storageUnit, somSelf);
  1606.  
  1607.     SOM_CATCH_ALL
  1608.     SOM_ENDTRY
  1609. }
  1610.  
  1611. SOM_Scope void  SOMLINK ODPartWrapperInitPartFromStorage(ODPartWrapper *somSelf, Environment *ev,
  1612.         ODStorageUnit* storageUnit, ODPart* partWrapper)
  1613. {
  1614.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1615.  
  1616.     SOM_TRY
  1617.  
  1618.     _fPart->InitPartFromStorage(ev,storageUnit, somSelf);
  1619.  
  1620.     SOM_CATCH_ALL
  1621.     SOM_ENDTRY
  1622. }
  1623.